#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/eventfd.h>

// 全局 eventfd 文件描述符
int efd;

// 共享缓冲区
int buffer = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 生产者线程
void* producer(void* arg) {
    for (int i = 0; i < 5; i++) {
        // 生产数据
        sleep(1);  // 模拟耗时操作

        // 加锁修改缓冲区
        pthread_mutex_lock(&mutex);
        buffer = i + 1;
        printf("生产者: 生产数据 %d\n", buffer);
        pthread_mutex_unlock(&mutex);

        // 通知消费者（写入 1 到 eventfd）
        uint64_t value = 1;
        write(efd, &value, sizeof(value));
    }
    return NULL;
}

// 消费者线程
void* consumer(void* arg) {
    for (int i = 0; i < 5; i++) {
        // 等待事件通知（读取 eventfd）
        uint64_t value;
        read(efd, &value, sizeof(value));

        // 加锁读取缓冲区
        pthread_mutex_lock(&mutex);
        printf("消费者: 消费数据 %d (eventfd 值 = %lu)\n", buffer, value);
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main() {
    // 创建 eventfd，初始值为 0
    efd = eventfd(0, 0);
    if (efd == -1) {
        perror("eventfd");
        return 1;
    }

    // 创建生产者和消费者线程
    pthread_t producer_t, consumer_t;
    pthread_create(&producer_t, NULL, producer, NULL);
    pthread_create(&consumer_t, NULL, consumer, NULL);

    // 等待线程结束
    pthread_join(producer_t, NULL);
    pthread_join(consumer_t, NULL);

    // 关闭 eventfd
    close(efd);
    return 0;
}